package es.efor.ics.gev.model;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

/**
 * The persistent class for the <b>GASTOS</b> database table.
 * 
 * @author dlisbona
 * 
 */
@Entity
@Table(name = "GASTOS")
public class Gasto extends BaseObject implements Serializable {

	// static data
	private static final long serialVersionUID = 1062544111112070979L;

	// private instance data
	private Long id;
	private Long numeroFactura; // required
	private Date fechaCreacion = new Date(); // required	
	private Concepto conceptoGasto; // required
	private BigDecimal importe; // required
	private Evento evento; // required
	private Organizacion proveedor; // required
	private String observaciones;	
	private Integer version;

	/**
	 * Construct an uninitialized <code>Gasto</code> (for runtime proxy
	 * generation in Hibernate).
	 */
	protected Gasto() {
	}
	
	/**
	 * Construct an initialized <code>Gasto</code>.
	 * 
	 * @param numeroFactura
	 * @param conceptoGasto
	 * @param importe
	 * @param evento
	 * @param proveedor
	 * @param observaciones
	 */
	public Gasto(Long numeroFactura, Concepto conceptoGasto,
			BigDecimal importe, Evento evento, Organizacion proveedor,
			String observaciones) {	
		this.numeroFactura = numeroFactura;
		this.conceptoGasto = conceptoGasto;
		this.importe = importe;
		this.evento = evento;
		this.proveedor = proveedor;
		this.observaciones = observaciones;
	}

	// ********************** Accessor Methods ********************** //

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "GASTO_ID")
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	@Column(name = "NUMERO_FACTURA", nullable = false)
	public Long getNumeroFactura() {
		return numeroFactura;
	}

	public void setNumeroFactura(Long numeroFactura) {
		this.numeroFactura = numeroFactura;
	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "FECHA_CREACION", nullable = false)
	public Date getFechaCreacion() {
		return fechaCreacion;
	}

	public void setFechaCreacion(Date fechaCreacion) {
		this.fechaCreacion = fechaCreacion;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "CONCEPTO_GASTO_ID", nullable = true)
	@org.hibernate.annotations.ForeignKey(name = "FK_GASTO_CONCEPTO_GASTO_ID")
	public Concepto getConceptoGasto() {
		return conceptoGasto;
	}

	public void setConceptoGasto(Concepto conceptoGasto) {
		this.conceptoGasto = conceptoGasto;
	}

	@Column(name = "IMPORTE", nullable = false, precision=8, scale=2)
	public BigDecimal getImporte() {
		return importe;
	}

	public void setImporte(BigDecimal importe) {
		this.importe = importe;
	}
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "EVENTO_GASTO_ID", nullable = true)
	@org.hibernate.annotations.ForeignKey(name = "FK_EVENTO_GASTO_ID")
	public Evento getEvento() {
		return evento;
	}

	public void setEvento(Evento evento) {
		this.evento = evento;
	}
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "PROVEEDOR_GASTO_ID", nullable = true)
	@org.hibernate.annotations.ForeignKey(name = "PROVEEDOR_GASTO_ID")
	public Organizacion getProveedor() {
		return proveedor;
	}

	public void setProveedor(Organizacion proveedor) {
		this.proveedor = proveedor;
	}

	@Column(name = "OBSERVACIONES", length = 255)
	public String getObservaciones() {
		return observaciones;
	}

	public void setObservaciones(String observaciones) {
		this.observaciones = observaciones;
	}

	@Version
	@Column(name = "OBJ_VERSION")
	public Integer getVersion() {
		return version;
	}

	public void setVersion(Integer version) {
		this.version = version;
	}

	// ********************** Common Methods ********************** //

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Gasto == false) {
			return false;
		}
		if (this == obj) {
			return true;
		}
		Gasto rhs = (Gasto) obj;
		return new EqualsBuilder().append(this.getNumeroFactura(),
				rhs.getNumeroFactura()).isEquals();
	}

	@Override
	public int hashCode() {
		return new HashCodeBuilder(17, 37).append(this.getNumeroFactura())
				.toHashCode();
	}

	@Override
	public String toString() {
		return new ToStringBuilder(this, ToStringStyle.DEFAULT_STYLE).append(
				"numeroFactura", this.getNumeroFactura()).append("conceptoGasto",
				this.getConceptoGasto()).append("fechaCreacion",
				this.getFechaCreacion()).toString();
	}

}
